// 所有的东西都需要用shader去渲染
// 所以先把 shader 都定义出来
// 并且把shader 需要的数据也都定义出来
//

let {loadText} = require('../loader');
let buildShader = require('../utils/shaderUtils');

const ShaderName = require('./ShaderName');


let ShaderLib = {
    _gl: null,
    _shaders: {},
    installShaders(gl, cb) {

        this._gl = gl;

        // 加载并且编译第一个shader
        // pos
        let pos_vs = loadText('../assets/line.vs.glsl');
        let pos_fs = loadText('../assets/line.fs.glsl');
        let p1 = Promise.all([pos_vs, pos_fs]).then((res) => {
            let shader = buildShader(gl, res[0], res[1]);
            shader.createUniforms(['projMatrix', 'vmMatrix']);
            shader.createAttribs(['a_position']);
            this._shaders[ShaderName.POS] = shader;

            // pos_1 使用的shader 和 pos 使用的shader一样
            // 只是传递的顶点格式不一样
            this._shaders[ShaderName.POS_1] = shader;
        });


        // POS_UV
        let posUV_vs = loadText('../assets/main.vs.glsl');
        let posUV_fs = loadText('../assets/main.fs.glsl');
        let p2 = Promise.all([posUV_vs, posUV_fs]).then((res) => {
            let shader = buildShader(gl, res[0], res[1]);
            shader.createUniforms(['projMatrix', 'vmMatrix', 'u_sampler']);
            shader.createAttribs(['a_position', 'a_uv']);

            this._shaders[ShaderName.POS_UV] = shader;
        });


        Promise.all([p1, p2]).then(() => {
            console.log('shader lib install success');
            cb();
        });
    },


    getShader(shaderName) {
        return this._shaders[shaderName];
    }
};


/**
 *
 * @param gl
 * @param data {{
 *     shaderType:number,
 *     projMatrix:Matrix4,
 *     vmMatrix:Matrix4,
 *     vao:GLint,
 *     primitive:GLint,
 *     vertexSize:number
 * }}
 */
// ShaderLib[Names.POS] = function render(gl, data) {
//     let shader = ShaderLib.getShader(data.shaderType);
//     gl.useProgram(shader.program);
//     shader.setMatrix4('projMatrix', data.projMatrix);
//     shader.setMatrix4('vmMatrix', data.vmMatrix);
//     gl.bindVertexArrayOES(data.vao);
//     gl.drawArrays(data.primitive, 0, data.vertexSize);
// };

/**
 *
 * @param gl
 * @param data {{
 *     shaderType:number,
 *     projMatrix:Matrix4,
 *     vmMatrix:Matrix4,
 *     vao:GLint,
 *     primitive:GLint,
 *     vertexSize:number
 * }}
 */
// ShaderLib[Names.POS_1] = function render(gl, data) {
//     let shader = ShaderLib.getShader(data.shaderType);
//     gl.useProgram(shader.program);
//     shader.setMatrix4('projMatrix', data.projMatrix);
//     shader.setMatrix4('vmMatrix', data.vmMatrix);
//     gl.bindVertexArrayOES(data.vao);
//     gl.drawElements(data.primitive, data.vertexSize, gl.UNSIGNED_SHORT, 0);
// };

/**
 *
 * @param gl
 * @param data {{
 *     shaderType:number,
 *     projMatrix:Matrix4,
 *     vmMatrix:Matrix4,
 *     vao:GLint,
 *     primitive:GLint,
 *     vertexSize:number,
 *     texId:GLint
 * }}
 */
// ShaderLib[Names.POS_UV] = function render(gl, data) {
//     let shader = ShaderLib.getShader(data.shaderType);
//     gl.useProgram(shader.program);
//     shader.setMatrix4('projMatrix', data.projMatrix);
//     shader.setMatrix4('vmMatrix', data.vmMatrix);
//     gl.activeTexture(gl.TEXTURE0);
//     gl.bindTexture(gl.TEXTURE_2D, data.texId);
//     shader.setUniform1i('u_sampler', 0);
//     gl.bindVertexArrayOES(data.vao);
//     gl.drawElements(data.primitive, data.vertexSize, gl.UNSIGNED_SHORT, 0);
// };
//
// ShaderLib.Names = Names;



//---------------------------



//----------------------------
// shader
// ShaderLib.makeGLData = function (obj) {
//     let {mesh, shaderName, primitive} = obj;
//     let shader = ShaderLib.getShader(shaderName);
//     switch (shaderName) {
//         case Names.POS:
//             createPosData({
//                 gl: ShaderLib._gl,
//                 shader: shader,
//                 primitive: primitive,
//                 posArr: mesh.posArr
//             });
//             break;
//         case Names.POS_1:
//             createPos1Data({
//                     gl: ShaderLib._gl,
//                     shader: shader,
//                     primitive: primitive,
//                     posArr: mesh.posArr,
//                     indiceArr:mesh.indiceArr
//                 });
//             break;
//         case Names.POS_UV:
//             createPosUVData({
//                 gl: ShaderLib._gl,
//                 shader: shader,
//                 primitive: gl.TRIANGLES,
//                 posArr: mesh.posArr,
//                 indiceArr:mesh.indiceArr,
//                 texId:mesh.texId,
//                 uvArr:mesh.uvArr
//             });
//             break;
//         case Names.POS_UV_NORMAL:
//             break;
//     }
// };


module.exports = ShaderLib;
